package com.peng.sparktest.sparksql

import org.apache.spark.sql.catalog.{Database, Table}
import org.apache.spark.sql.{DataFrame, Dataset, SparkSession, catalog}
import org.apache.spark.{SparkConf, SparkContext}

object SparkSql01_Base {
  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf().setAppName("spark").setMaster("local")
    val session: SparkSession = SparkSession
      .builder()
      .config(conf)
      //      .master("local")
      //      .appName("spark")
      //      .enableHiveSupport() //开启后将从hive进行元数据读取
      .getOrCreate()

    val context: SparkContext = session.sparkContext
    context.setLogLevel("ERROR")

    println("--------------------无数据打印-----------------------------")
    val databases: Dataset[Database] = session.catalog.listDatabases()
    databases.show()
    val tables: Dataset[Table] = session.catalog.listTables()
    tables.show()
    println("--------------------打印函数-----------------------------")
    val functions: Dataset[catalog.Function] = session.catalog.listFunctions()
    functions.show(999, truncate = true) //显示行数，是否展开列显示


    println("----------------------读取数据---------------------------")

    // spark-sql 高层次的封装： DataSet  实际底层也是RDD，最终需要转成RDD进行执行任务
    //dataframe实际也是一个DataSet[Row]
    val dataFrame: DataFrame = session.read.json("./test_file/json")
    dataFrame.show() //action算子
    dataFrame.printSchema() //表结构

    dataFrame.createTempView("mytable") //创建临时表,将读取数据映射成表，相当于注册这段读取的json信息作为一张临时表记录下来
    session.sql("select * from mytable") //注册完就可以进行查询

    println("----------------------读取数据注册表后打印---------------------------")
    val databases2: Dataset[Database] = session.catalog.listDatabases()
    databases2.show()
    val tables2: Dataset[Table] = session.catalog.listTables() //可以发现， mytable已经有显示在列表里
    tables2.show()

    import scala.io.StdIn._
    while (true) {
      //这个过程也可以演化成，不同进程间通信，传递sql，然后执行
      val sql: String = readLine("please input your sql:")
      session.sql(sql).show()
      session.read.text("")
    }


  }

}
